/*******************************************************************************
 * @file Copyright 2009 The CREATE Lab at CMU
 * 
 *       This file is part of JubJub, an open source project.
 *       http://code.google.com/p/jubjub/
 * 
 *       Redistribution and use in source and binary forms, with or without
 *       modification, are permitted provided that the following conditions are
 *       met:
 * 
 *       Redistributions of source code must retain the above copyright notice,
 *       this list of conditions and the following disclaimer.
 * 
 *       Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 * 
 *       Neither the name of Carnegie Mellon nor the names of its contributors
 *       may be used to endorse or promote products derived from this software
 *       without specific prior written permission.
 * 
 *       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 *       PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *       HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

package edu.cmu.ri.createlab.jj.shapes;

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.image.ImageObserver;

import edu.cmu.ri.createlab.jj.blocks.VarBlock;
import edu.cmu.ri.createlab.jj.shapes.JJShapeFactory.PathTypes;
import edu.cmu.ri.createlab.jj.visitors.BVDrawer;

public class VarShape implements JJShapeInterface
{
   ///top and bot edge refer to the main horizontal for a shape, where
   ///a line is drawn to show block placement and where the next block
   ///will be aligned to 'snap' together.
   int topEdge;
   int botEdge;
   int x;
   int y;
   double scale;
   BlockPath path;
   VarBlock block;
   boolean selected;
   
   public VarShape(int x, int y, VarBlock var, double scale)
   {
      path = new JJShapeFactory().buildPath(x, y, PathTypes.VAR_BLOCK, 0, scale);
      topEdge = path.getTop();
      botEdge = path.getBot();
      this.x = x;
      this.y = y;
      this.scale = scale;
      block = var;
      selected = false;
   }
   
   public void setBlock(VarBlock block)
   {
      this.block = block;
   }
   
   public VarBlock getBlock()
   {
      return block;
   }
   
   
   public void clear()
   {
      path = null;
      topEdge = 0;
      botEdge = 0;
      scale = 1;
   }
   
   
   public boolean contains(int x, int y)
   {
      return path.contains(x, y);
   }
   
   public boolean contains(int y)
   {
      return y >= topEdge && y <= botEdge;
   }
   
   
   public boolean clicked()
   {
      //TODO check what was clicked and respond accordingly
      selected = true;
      System.out.println("I been clicked, yo!");
      return false;
   }

   
   public void draw(Graphics g, ImageObserver o, BVDrawer drawer)
   {
      drawer.setScale(scale);
      drawer.setStart(x, y);
      //TODO if g and o are always set before calling this edit out
      drawer.setGraphics(g);
      drawer.setObserver(o);
      block.accept(drawer);
   }

   
   public int[] getBounds()
   {
      // TODO Auto-generated method stub
      int[] bounds = new int[4];
      Rectangle rect = this.path.getPath().getBounds();
      bounds[0] = (int)rect.getMinX();
      bounds[1] = (int)rect.getMinY();
      bounds[2] = (int)rect.getMaxX();
      bounds[3] = (int)rect.getMaxY();
      return bounds;
   }

   
   public void setOrigin(int x, int y)
   {
      //a new path is created to prevent cumulative rounding errors for repeated repositioning.
      this.x = x;
      this.y = y;
      path = (new JJShapeFactory().buildPath(x, y, PathTypes.VAR_BLOCK, 0, scale));
      topEdge = path.getTop();
      botEdge = path.getBot();
   }
   
   
   public void setScale(double scale)
   {
      //a new path is created to prevent cumulative rounding errors for repeated rescaling.
      this.scale = scale;
      path = (new JJShapeFactory().buildPath(x, y, PathTypes.VAR_BLOCK, 0, scale));
      topEdge = path.getTop();
      botEdge = path.getBot();
   }

}
